﻿using System;
using Logica;
using System.Windows.Forms;
using accesoDatos;
using clasesBase;

namespace PlanificacionProduccion
{
    public class ManejadorAyudas
    {
        // Atributos que contendrán los valores devueltos por los formularios de ayudas contextuales
        private int idSeleccionado = 0;
        private string nombreSeleccionado = "";

        // Requeridos para algunos tipos especiales de búsqueda
        private string valorExtraSeleccionado = "";

        // Variables internas para el filtrado de datos
        string[] camposFiltro = new string[] { };
        string[] valoresFiltro = new string[] { };
        string campoID = "id", campoNombre = "nombre";
        bool ayudaEnProceso = false;

        // Propiedades para acceder a los valores seleccionados
        public int IdSeleccionado
        {
            get { return this.idSeleccionado; }
        }

        public string NombreSeleccionado
        {
            get { return this.nombreSeleccionado; }
        }

        public string ValorExtraSeleccionado
        {
            get { return this.valorExtraSeleccionado; }
        }

        public bool AyudaEnProceso
        {
            get { return this.ayudaEnProceso; }
        }

        public bool existeElemento(string tablaBD, int id, string nombre)
        {
            // Si el id fuera -1, significa que sólo se desea buscar el nombre y no el par id-nombre
            if (id != -1)
            {
                if (nombre.Trim().Equals("")) nombre = "SIN ESPECIFICAR";
                return EntidadAlmacenable.existe(id, nombre, tablaBD);
            }
            else return EntidadAlmacenable.existe(nombre, tablaBD);
        }

        private void definirCamposConsulta(string tablaBD, int id, string nombre, bool porNombre)
        {
            /* Para facilitar la reutilización de métodos, se personalizan sólo en éste paso las cuestiones
             * correspondientes a los nombres de las columnas de cada tabla consultada. Si el nombre de las
             * columnas asociadas al identificador y la descripción del elemento fuera distinto de "id" y "nombre", 
             * cambiar en ÉSTE punto. */

            // Por defecto se considera que lo más común es la búsqueda por nombre, pero si el nombre fuera vacío y
            // se buscara por ID, se cambian los campos y valores de filtrado según corresponda
            switch (tablaBD)
            {
                // Si los campos de filtrado o valores fueran distintos de los especificados, se definen acá
                // EJEMPLOSSSSSSSSSSSSSSSSSSSSS
                //case MotivoSIEM.tablaBD:
                //    if (porNombre)
                //    {
                //        this.camposFiltro = new string[] { campoNombre };
                //        this.valoresFiltro = new string[] { "I" + nombre.Trim() };
                //    }
                //    else
                //    {
                //        this.camposFiltro = new string[] { "codigoMotivo" };
                //        this.valoresFiltro = new string[] { "I" + this.codigoMotivoSIEMSeleccionado.Trim() };
                //    }
                //    break;

                //case Personal.tablaBD:
                //    if (porNombre)
                //    {
                //        this.camposFiltro = new string[] { "personal.nombre" };
                //        this.valoresFiltro = new string[] { "I" + nombre.Trim() };
                //    }
                //    else
                //    {
                //        this.camposFiltro = new string[] { campoID };
                //        this.valoresFiltro = new string[] { "E" + id.ToString() };
                //    }
                //    break;

                default: // Para la mayoría de los casos
                    if (porNombre)
                    {
                        this.camposFiltro = new string[] { campoNombre };
                        this.valoresFiltro = new string[] { "I" + nombre.Trim() };
                    }
                    else
                    {
                        this.camposFiltro = new string[] { campoID };
                        this.valoresFiltro = new string[] { "E" + id.ToString() };
                    }
                    break;
            }
        }

        public void mostrarElementos(string tablaBD, int id, string nombre, bool busquedaPorNombre)
        {
            // Por defecto se asignan a los atributos de la clase, los valores recibidos como parámetros
            this.idSeleccionado = id;
            this.nombreSeleccionado = nombre.Trim();

            if (!FormsUnicos.MTipoFormColeccion.ContainsKey(typeof(FrmAyudas)) && !ayudaEnProceso)
            {
                ayudaEnProceso = true;

                bool requeridosCompletos = false;
                if (busquedaPorNombre && !nombre.Trim().Equals("")) requeridosCompletos = true;
                if (!busquedaPorNombre && !id.Equals(0)) requeridosCompletos = true;

                if (requeridosCompletos)
                {
                    if (!existeElemento(tablaBD, id, nombre))
                    {
                        definirCamposConsulta(tablaBD, id, nombre, busquedaPorNombre);
                        FrmAyudas formAyuda = FormsUnicos.ObtenerInstancia<FrmAyudas>(null);
                        formAyuda.setearTipoAyuda(tablaBD, camposFiltro, valoresFiltro);
                        formAyuda.ShowDialog();

                        if (formAyuda.DialogResult == DialogResult.OK && formAyuda.FilaSeleccionada != null)
                        {
                            this.idSeleccionado = Convert.ToInt32(formAyuda.FilaSeleccionada.Cells[campoID].Value);
                            this.nombreSeleccionado = formAyuda.FilaSeleccionada.Cells[campoNombre].Value.ToString();
                        }
                        else
                        {
                            this.idSeleccionado = 0;
                            this.nombreSeleccionado = "";
                        }

                        formAyuda.Dispose();
                    }
                }
                else idSeleccionado = 0;
            }

            ayudaEnProceso = false;
        }

        public void mostrarElementos(string tablaBD, string nombre, bool busquedaPorNombre)
        {
            int id = -1;
            mostrarElementos(tablaBD, id, nombre, busquedaPorNombre);
        }

        public void mostrarElementos(string tablaBD)
        {
            mostrarTodos(tablaBD);
        }

        private void mostrarTodos(string tablaBD)
        {
            ayudaEnProceso = true;

            // Por defecto se asignan a los atributos de la clase, los valores recibidos como parámetros
            this.idSeleccionado = 0;
            this.nombreSeleccionado = "";

            FrmAyudas formAyuda = FormsUnicos.ObtenerInstancia<FrmAyudas>(null);
            formAyuda.setearTipoAyuda(tablaBD, new string[] { }, new string[] { });
            formAyuda.ShowDialog();

            if (formAyuda.DialogResult == DialogResult.OK && formAyuda.FilaSeleccionada != null)
            {
                this.idSeleccionado = Convert.ToInt32(formAyuda.FilaSeleccionada.Cells[campoID].Value);
                this.nombreSeleccionado = formAyuda.FilaSeleccionada.Cells[campoNombre].Value.ToString();
            }
            else
            {
                this.idSeleccionado = 0;
                this.nombreSeleccionado = "";
            }

            formAyuda.Dispose();

            ayudaEnProceso = false;
        }

        //public void mostrarElementosMotivoSIEM(int id, string nombre, string codigoMotivo, bool busquedaPorNombre)
        //{
        //    // Por defecto se asignan a los atributos de la clase, los valores recibidos como parámetros
        //    this.idSeleccionado = id;
        //    this.nombreSeleccionado = nombre.Trim();
        //    this.codigoMotivoSIEMSeleccionado = codigoMotivo.Trim();

        //    bool requeridosCompletos = false;
        //    if (busquedaPorNombre && !nombre.Trim().Equals("")) requeridosCompletos = true;
        //    if (!busquedaPorNombre && !codigoMotivo.Equals("")) requeridosCompletos = true;

        //    if (requeridosCompletos)
        //    {
        //        if (!MotivoSIEM.existe(id, nombre, codigoMotivo))
        //        {
        //            definirCamposConsulta(MotivoSIEM.tablaBD, id, nombre, busquedaPorNombre);

        //            if (!ProveedorFormsUnicos.MTipoFormColeccion.ContainsKey(typeof(Ayuda)))
        //            {
        //                Ayuda formAyuda = ProveedorFormsUnicos.ObtenerInstancia<Ayuda>(null);
        //                formAyuda.setearTipoAyuda(MotivoSIEM.tablaBD, camposFiltro, valoresFiltro);
        //                formAyuda.ShowDialog();

        //                if (formAyuda.DialogResult == DialogResult.OK && formAyuda.FilaSeleccionada != null)
        //                {
        //                    this.idSeleccionado = Convert.ToInt32(formAyuda.FilaSeleccionada.Cells[campoID].Value);
        //                    this.nombreSeleccionado = formAyuda.FilaSeleccionada.Cells[campoNombre].Value.ToString();
        //                    this.codigoMotivoSIEMSeleccionado = formAyuda.FilaSeleccionada.Cells["codigoMotivo"].Value.ToString();
        //                }
        //                else
        //                {
        //                    this.idSeleccionado = 0;
        //                    this.nombreSeleccionado = "";
        //                    this.codigoMotivoSIEMSeleccionado = "";
        //                }

        //                formAyuda.Dispose();
        //            }
        //        }
        //    }
        //    else { idSeleccionado = 0; codigoMotivoSIEMSeleccionado = ""; }
        //}
    }
}
